<?php
require './function.php';
/**
 * @Author: Wherein
 * @Date: 2021-04-16 13:21
 * @Descripttion: 迭代模式
 * @example 通过实现Iterator接口，我们就可以把一个对象里的数据当一个数组一样遍历。也许你会说我把一个数组直接遍历不就行了吗，为什么你还要把数组扔给容器对象，再遍历容器对象呢？是这样的，通过容器对象，我们可以隐藏我们foreach的操作。比如说，我想遍历时，一个元素输出，一个元素不输出怎么办呢？ 把index++改index+=2
 */

class ArrayControler implements Iterator
{
    protected $data = array();
    protected $index;

    public function __construct($data)
    {
        $this->data = $data;
    }

    // 返回当前指针指向数据
    public function current()
    {
        return $this->data[$this->index];
    }

    // 指针+1
    public function next()
    {
        $this->index++;
    }
    // 验证指针是否越界
    public function valid()
    {
        return $this->index < count($this->data);
    }
    // 重置指针
    public function rewind()
    {
        $this->index = 0;
    }
    // 返回当前指针
    public function key()
    {
        return $this->index;
    }
}

// 初始化数组容器
$arr = array(0 => '唐朝', 1 => '宋朝', 2 => '元朝');
$container = new ArrayControler($arr);

// 遍历数组容器
foreach ($container as $a => $dynasty) {
    dd($container->current(), 'n');
    dd($container->key(), 'n');
    dd($container->valid(), 'n');
    dd('如果有时光机, 我想去' . $dynasty, 'n');
}
